package main

// go map  反射原理
import (
	"fmt"
	"reflect"
)

func main_map() {
	// 创建一个 map
	m := make(map[string]int)
	m["a"] = 1

	// 反射操作
	mv := reflect.ValueOf(m)

	// 获取 map 的键
	keys := mv.MapKeys()

	// 遍历键并打印值
	for _, k := range keys {
		fmt.Println("Key:", k.Interface(), "Value:", mv.MapIndex(k).Interface())
	}

	// 使用反射设置 map 的值
	ka := reflect.ValueOf("a")
	kb := reflect.ValueOf("b")
	mv.SetMapIndex(ka, reflect.ValueOf(2))
	mv.SetMapIndex(kb, reflect.ValueOf(3))

	// 打印修改后的 map
	fmt.Println("Modified map:", m)

	// 获取 map 的键
	keys = mv.MapKeys()

	// 遍历键并打印值
	for _, k := range keys {
		fmt.Println("Key:", k.Interface(), "Value:", mv.MapIndex(k).Interface())
	}
}

// go map 读写锁
package main

import (
    "sync"
    "time"
)

// 安全的map类型
type SafeMap struct {
    m map[string]int
    sync.RWMutex
}

// 新建一个安全的map
func NewSafeMap() *SafeMap {
    return &SafeMap{
        m: make(map[string]int),
    }
}

// 写操作
func (sm *SafeMap) Set(key string, value int) {
    sm.Lock() // 加写锁
    sm.m[key] = value
    sm.Unlock() // 解写锁
}

// 读操作
func (sm *SafeMap) Get(key string) (int, bool) {
    sm.RLock() // 加读锁
    value, ok := sm.m[key]
    sm.RUnlock() // 解读锁
    return value, ok
}

func main() {
    sm := NewSafeMap()

    // 写操作
    go func() {
        for i := 0; i < 10; i++ {
            sm.Set("key", i)
            time.Sleep(time.Millisecond * 100)
        }
    }()

    // 读操作
    for i := 0; i < 10; i++ {
        value, _ := sm.Get("key")
        println("Read:", value)
        time.Sleep(time.Millisecond * 200)
    }
}
